package cn.huiyunche.base.service.interfaces;

import cn.huiyunche.base.service.model.CBill;
import cn.huiyunche.base.service.model.CBillExample;
import cn.huiyunche.base.service.vo.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 账单接口类
 *
 * @author lm
 */
public interface CAccntBillService {

    /**
     * 生成周账单, 只生成司机的账单
     * 并且增加 账户余额表中可提现金额
     *
     * @param beginDate     2016-08-15 00:00:00
     * @param endDate       2016-08-22 00:00:00
     * @param updateBalance 是否更新余额(可提现金额)
     * @param redo          是否是重新结算
     * @param userId        司机账户ID
     * @param userType      账户类型：司机账户
     */
    boolean genMonthBill(Date beginDate, Date endDate, Boolean updateBalance, Boolean redo,
                         Long userId, int userType);

    /**
     * 生成物流企业 月账单
     * 月对账使用 包含：邀请司机注册的费用20 和 未支付给企业的运输费用
     *
     * @param beginDate 2016-07-01 00:00:00
     * @param endDate   2016-08-01 00:00:00
     * @param redo      是否重新结算
     * @param userId    公司账户ID
     * @param userType  账户类型：运输公司
     * @return
     */
    boolean genStanCompanyMonthBill(Date beginDate, Date endDate, boolean redo, Long userId, int userType);

    /**
     * 生成托运企业 - 个人 月账单
     * 月对账使用 包含：发车的每一单的 实际金额
     *
     * @param beginDate 2016-07-01 00:00:00
     * @param endDate   2016-08-01 00:00:00
     * @param redo      是否重新结算
     * @param userId    公司账户ID
     * @param userType  账户类型：托运企业
     * @param userIdSet 用户ID set集合(去除非自然月出账单的托运企业)
     * @return
     */
    boolean genKyleMonthBill(Date beginDate, Date endDate, boolean redo, Long userId, int userType, Set<Long> userIdSet);

    /**
     * 分页查询账单信息
     * 根据账户类型 userType
     *
     * @param page
     * @param bill
     * @param userType
     * @return
     */
    Map<String, Object> getBills(PageVo page, CBillAdminVo bill, int userType);

    /**
     * 根据当前用户 查询该用户所有账单
     * ＋ 本月车辆数
     * ＋ 本月订单数
     * ＋ 未支付金额(部分付款)
     *
     * @return
     */
    List<CBillOrdersVo> getBillsAddOrders(Integer billType);

    Map<String, Object> getTotalBillsAddOrders();

    /**
     * 根据账单ID 查询账单明细
     *
     * @param billId
     * @return
     */
    Map<String, Object> getBillDetails(PageVo page, Long billId);

    /**
     * 根据用户ID 用户类型  查询用户最后一个月账单
     * －－ 托运企业 首页显示
     *
     * @param userId
     * @param userType
     * @return
     */
    CBill getLastMonthBill(Long userId, int userType);

    /**
     * 托运企业 月账单结算的时候 使用积分
     * 扣除积分
     *
     * @param billId
     * @return
     */
    Result<String> kyleCompanyBillUserScores(Long billId);

    /**
     * 根据主键查询账单
     *
     * @param billId
     * @return
     */
    CBill selectByPrimaryKey(Long billId);

    /**
     * 根据账单ID 更新积分抵扣金额
     *
     * @param cBill
     * @return
     */
    int updateByParimayKey(CBill cBill);

    /**
     * 托运公司结算
     *
     * @param billId
     * @return
     */
    int updateBillStatus(Long billId);

    /**
     * 托运公司 提交结算申请
     *
     * @param billId
     * @return
     */
    Result<String> kyleCompanySettlement(Long billId);

    /**
     * 获取托运公司 结算金额
     *
     * @param billId
     * @return
     */
    BigDecimal getSettlementAmount(Long billId);

    /**
     * 托运企业支付月账单
     *
     * @param billId
     * @return
     */
    Result<String> payBillFinish(Long billId);

    /**
     * 同城 账单明细
     *
     * @param page
     * @param billid
     * @return
     */
    Map<String, Object> getVeneerBillDetails(PageVo page, Long billid);

    /**
     * 人送项目司机 提现申请
     *
     * @param userId
     * @param userType
     * @return
     */
    Result<String> submitSettlementAppli(Long userId, Integer userType);

    /**
     * 人送项目 按照账单结算
     *
     * @param id
     * @return
     */
    Result<String> settlementById(Long id);

    List<CBill> selectByExample(CBillExample billExample);


    /**
     * 生成人送车队 月账单
     *
     * @param beginDate
     * @param endDate
     * @param redo
     * @param userId
     * @param userType
     * @param updateBalance
     * @return
     */
    boolean genDriver3rdMonthBill(Date beginDate, Date endDate, Boolean redo, Long userId, Integer userType,
                                  Boolean updateBalance);

    /**
     * 商户 生成账单 发送推送消息
     *
     * @param userType
     * @param beginDate
     * @param endDate
     */
    void sendBillMessage(Long userId, int userType, Date beginDate, Date endDate);

    /**
     * 人送项目司机 账单列表
     * @param page
     * @param value
     * @return
     */
    // List<E> getSendbydriverBills(PageVo page, int value);

    /**
     * 根据账单ID 查询商户账单 文件
     *
     * @param billId
     * @return
     */
    BillBFiles generateShareUrl4File(Long billId);

    /**
     * @param billId
     * @return
     */
    HSSFWorkbook generateExcel(Long billId);

    /**
     * 商户app 查询明细数据
     *
     * @param page
     * @param billId
     * @return
     */
    Map<String, Object> getAppBillDetails(PageVo page, Long billId);

    /**
     * 查询账单 可用积分
     *
     * @param billId
     * @return
     */
    Map<String, Object> getBillScores(Long billId, Integer billType);

    BigDecimal getScoresUserdAmount(Long billId);

    /*
     * 司机提现申请列表-导出
     */
    List<String[]> exportDriverWithdrawalApplication(CBillAdminVo bill, int userType, int length);

    List<CBillAdminVo> getBills(CBillAdminVo bill, int userType);

}